package com.sjh.lib_app.utils

import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.text.SpannableString
import android.text.Spanned
import android.text.SpannedString
import android.text.style.AbsoluteSizeSpan
import android.widget.EditText
import androidx.fragment.app.Fragment
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.entity.LocalMedia
import com.sjh.baseutils.loge
import com.sjh.lib_app.R
import java.util.concurrent.atomic.AtomicInteger


/**
 * 不成套或者兼容性不强的工具方法
 * @author Extends
 * @date 2020/4/21
 */
object Utils {
    /**
     *
     * 给EditTextView设置提示文本的工具方法，由于EditTextView的API不支持提示文本和输入文本大小不一致，所以用这个方法单独设置提示文本。
     * 该方法可以设置提示文本的字体大小。
     * @param size 字体大小，单位 dp
     */
    fun setEditTextHintSize(editText: EditText, hintText: String?, size: Int) {
        val ss = SpannableString(hintText) //定义hint的值
        val ass = AbsoluteSizeSpan(size, true) //设置字体大小 true表示单位是sp
        ss.setSpan(ass, 0, ss.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        editText.hint = SpannedString(ss)
    }


    /**
     * 返回指定长度的字符串
     */
    fun substring(text:String?,mun:Int):String{
        return if(text == null){
            ""
        }else if (text.length>=mun){
            text.substring(0,mun)+"..."
        }else{
            text
        }
    }

    /**
     * 查看大图
     * @param selectList 图片list  如果是单张图片则 arrayListOf(img_path)
     * @param position 图片的位置
     */
    fun openBigImage(activity:Activity,selectList:List<String>,position:Int = 0){
        if(selectList.isEmpty()) return
        PictureSelector.create(activity)
            .themeStyle(R.style.picture_default_style)
            .isNotPreviewDownload(true)
            .loadImageEngine(GlideEngine.createGlideEngine())
            .openExternalPreview(minOf(position,selectList.lastIndex), selectList.map { LocalMedia(it,0L,0,"image/*") })
    }

    /**
     * 查看大图
     * @param selectList 图片list  如果是单张图片则 arrayListOf(img_path)
     * @param position 图片的位置
     */
    fun openBigImage(fragment:Fragment,selectList:List<String>,position:Int = 0){
        if(selectList.isEmpty()) return
        PictureSelector.create(fragment)
            .themeStyle(R.style.picture_default_style)
            .isNotPreviewDownload(true)
            .loadImageEngine(GlideEngine.createGlideEngine())
            .openExternalPreview(minOf(position,selectList.lastIndex), selectList.map { LocalMedia(it,0L,0,"image/*") })
    }


    /**
     * 数据脱敏
     * @param data 需要脱敏的数据
     * @param headCharCount 前面显示的个数
     * @param tailCharCount 后面显示的个数
     *
     * example: 手机号 : Utils.encryptData(UserConfig.mobile_show,4,4)
     *
     * 姓名：仅显示最后一字，前边的每个字对应一个*符号
     * 公司名称：仅显示最后4字，前边的每个字对应一个*符号
     * 手机号码：仅显示前3位后4位共7位数字，中间每个数字对应一个*符号
     * 身份证号：仅显示最后4位数字，前边的每个数字对应一个*符号
     * 营业执照：仅显示最后4位数字，前边的每个数字对应一个*符号
     * 银行卡号：仅显示最后4位数字，前边的每个数字对应一个*符号
     * 连连商户号(分账商户ID)：后3位不脱敏
     */
    fun encryptData(data: String, headCharCount: Int, tailCharCount: Int): String {
        if(data.length < headCharCount + tailCharCount){
            loge("明文过短，无法脱敏 $data")
            return data
        }
        var repeat
                = ""
        val len = data.length - headCharCount - tailCharCount
        if (len > 0) {
            val buf = CharArray(len)
            val integer = AtomicInteger(0)
            arrayOfNulls<Char>(len).forEach { _ -> buf[integer.getAndIncrement()] = '*' }
            repeat = String(buf)
        }
        return data.substring(0, headCharCount) + repeat + data.substring(data.length - tailCharCount)
    }

    //检查当前系统是否已开启暗黑模式
    fun getDarkModeStatus(context: Context): Boolean {
        val mode: Int = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
        return mode == Configuration.UI_MODE_NIGHT_YES
    }
}